package com.lrs.java.designPattern.temp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 一般动态代理中必须实现InvocationHandler接口，实现invoke方法。
 */
public class DynamicProxy implements InvocationHandler {

	IService service = null;
	//创建一个代理类对象。
	public Object createProxy(IService service) {
		this.service = service;
		return (IService) Proxy.newProxyInstance(service.getClass()
				.getClassLoader(), service.getClass().getInterfaces(), this);
	}
	//根据反射机制，根据传入的不同的方法名动态的调用方法。
	//proxy指传入的具体的代理类对象，method指在这个代理类中调用的方法名，args存放这个方法中的参数
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object obj = method.invoke(service, args);
		return obj;
	}
	
	public static void main(String[] args) {
		//创建代理类，代理类中存在一个IService接口的引用。
		DynamicProxy dp = new DynamicProxy();
		//传入具体实现了IService接口的对象，指明具体实现了哪个对象的代理。
		IService service = (IService)dp.createProxy(new ServiceImp());	
		service.doSomething();
	}

}
